//package com.dsj.gxrd.config;
//
//import org.springframework.amqp.core.*;
//import org.springframework.amqp.rabbit.connection.ConnectionFactory;
//import org.springframework.amqp.rabbit.connection.CorrelationData;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * @author songpin566
// * @date 2023/11/08
// **/
//@Configuration
//public class RabbitMqConfig {
//
//    public static final String QUEUE_NAME = "queue_name"; //队列名称
//    public static final String EXCHANGE_NAME = "exchange_name"; //交换器名称
//    public static final String ROUTING_KEY = "routing_key"; //路由键
//
//    @Bean
//    public RabbitTemplate createRabbitTemplate(ConnectionFactory connectionFactory) {
//        RabbitTemplate rabbitTemplate = new RabbitTemplate();
//        rabbitTemplate.setConnectionFactory(connectionFactory);
//        //设置开启Mandatory,才能触发回调函数,无论消息推送结果怎么样都强制调用回调函数
//        rabbitTemplate.setMandatory(true);
//        //消息发送到交换机的回调函数
//        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
//            @Override
//            public void confirm(CorrelationData correlationData, boolean b, String s) {
//                System.out.println("相关消息：" + correlationData);
//                System.out.println("是否收到消息:" + b);
//                System.out.println("错误原因:" + s);
//                System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
//            }
//        });
//        //消息发送到队列的回调函数
//        rabbitTemplate.setReturnsCallback(
//                new RabbitTemplate.ReturnsCallback() {
//                    @Override
//                    public void returnedMessage(ReturnedMessage returnedMessage) {
//                        System.out.println("\n确认消息送到队列(Queue)结果：");
//                        System.out.println("发生消息：" + returnedMessage.getMessage());
//                        System.out.println("响应码：" + returnedMessage.getReplyCode());
//                        System.out.println("回应信息：" + returnedMessage.getReplyText());
//                        System.out.println("交换机：" + returnedMessage.getExchange());
//                        System.out.println("路由键：" + returnedMessage.getRoutingKey());
//                        System.out.println("====================================");
//                    }
//                }
//        );
//
//        return rabbitTemplate;
//    }
//
//    public static final String DELAY_QUEUE = "delay_queue";
//    public static final String DELAY_EXCHANGE = "delay_exchange";
//    public static final String DELAY_ROUTING_KEY = "delay_routing_key";
//    public static final String DEAD_QUEUE = "dead_queue";
//    public static final String DEAD_EXCHANGE = "dead_exchange";
//    public static final String DEAD_ROUTING_KEY = "dead_routing_key";
//    /**
//     * 队列
//     */
//    @Bean
//    public Queue delayQueue() {
//        /**
//         * 创建队列，参数说明：
//         * String name：队列名称。
//         * boolean durable：设置是否持久化，默认是 false。durable 设置为 true 表示持久化，反之是非持久化。
//         * 持久化的队列会存盘，在服务器重启的时候不会丢失相关信息。
//         * boolean exclusive：设置是否排他，默认也是 false。为 true 则设置队列为排他。
//         * boolean autoDelete：设置是否自动删除，为 true 则设置队列为自动删除，
//         * 当没有生产者或者消费者使用此队列，该队列会自动删除。
//         * Map<String, Object> arguments：设置队列的其他一些参数。
//         */
//        return new Queue(DELAY_QUEUE, true, false, false, null);
//    }
//
//    /**
//     * Direct交换器
//     */
//    @Bean
//    public CustomExchange delayExchange() {
//        /**
//         * 创建交换器，参数说明：
//         * String name：交换器名称
//         * boolean durable：设置是否持久化，默认是 false。durable 设置为 true 表示持久化，反之是非持久化。
//         * 持久化可以将交换器存盘，在服务器重启的时候不会丢失相关信息。
//         * boolean autoDelete：设置是否自动删除，为 true 则设置队列为自动删除，
//         */
//        Map<String, Object> args = new HashMap<>();
//        args.put("x-delayed-type", "direct");
//        return new CustomExchange(DELAY_EXCHANGE, "x-delayed-message", true, false, args);
//    }
//
//    /**
//     * 绑定
//     */
//    @Bean
//    Binding delayBinding(@Qualifier("delayExchange") CustomExchange exchange, @Qualifier("delayQueue") Queue queue) {
//        //将队列和交换机绑定, 并设置用于匹配键：routingKey
//        return BindingBuilder.bind(queue).to(exchange).with(DELAY_ROUTING_KEY).noargs();
//    }
//
//
//    /**
//     * 队列
//     */
//    @Bean
//    public Queue queue() {
//        /**
//         * 创建队列，参数说明：
//         * String name：队列名称。
//         * boolean durable：设置是否持久化，默认是 false。durable 设置为 true 表示持久化，反之是非持久化。
//         * 持久化的队列会存盘，在服务器重启的时候不会丢失相关信息。
//         * boolean exclusive：设置是否排他，默认也是 false。为 true 则设置队列为排他。
//         * boolean autoDelete：设置是否自动删除，为 true 则设置队列为自动删除，
//         * 当没有生产者或者消费者使用此队列，该队列会自动删除。
//         * Map<String, Object> arguments：设置队列的其他一些参数。
//         */
//        //正常队列绑定死信交换机
//        Map<String,Object>map=new HashMap<>();
//        map.put("x-dead-letter-exchange", DEAD_EXCHANGE);
//        //正常队列设置死信 routing-key 参数 key 是固定值
//        map.put("x-dead-letter-routing-key", "lisi");
//        return new Queue(QUEUE_NAME, true, false, false, map);
//    }
//
//    /**
//     * Direct交换器
//     */
//    @Bean
//    public DirectExchange exchange() {
//        /**
//         * 创建交换器，参数说明：
//         * String name：交换器名称
//         * boolean durable：设置是否持久化，默认是 false。durable 设置为 true 表示持久化，反之是非持久化。
//         * 持久化可以将交换器存盘，在服务器重启的时候不会丢失相关信息。
//         * boolean autoDelete：设置是否自动删除，为 true 则设置队列为自动删除，
//         */
//        return new DirectExchange(EXCHANGE_NAME, true, false);
//    }
//
//    /**
//     * 绑定
//     */
//    @Bean
//    Binding binding(DirectExchange exchange, Queue queue) {
//        //将队列和交换机绑定, 并设置用于匹配键：routingKey
//        return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
//    }
//
//
//}
